package cn.yunyichina.provider.framework.utils;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipOutputStream;

import org.apache.commons.lang.StringUtils;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipEntry;

/**
 * zip工具类
 * Created by JoeZ on 2016/10/14.
 */
public class ZipUtils {
    /**
     * 压缩文件-由于out要在递归调用外,所以封装一个方法用来
     * 调用ZipFiles(ZipOutputStream out,String path,File... srcFiles)
     * @param zip
     * @param path
     * @param srcFiles
     * @throws IOException
     * @author isea533
     */
    public static void ZipFiles(File zip,String path,File... srcFiles) throws IOException {
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zip));
        ZipUtils.ZipFiles(out,path,srcFiles);
        out.close();
        System.out.println("*****************压缩完毕*******************");
    }
    /**
     * 压缩文件-File
     * @param path  zip文件
     * @param srcFiles 被压缩源文件
     * @author isea533
     */
    public static void ZipFiles(ZipOutputStream out,String path,File... srcFiles){
        path = path.replaceAll("\\*", "/");
        if(!path.endsWith("/")){
            path+="/";
        }
        byte[] buf = new byte[1024];
        try {
            for(int i=0;i<srcFiles.length;i++){
                if(srcFiles[i].isDirectory()){
                    File[] files = srcFiles[i].listFiles();
                    String srcPath = srcFiles[i].getName();
                    srcPath = srcPath.replaceAll("\\*", "/");
                    if(!srcPath.endsWith("/")){
                        srcPath+="/";
                    }
                    out.putNextEntry(new ZipEntry(path+srcPath));
                    ZipFiles(out,path+srcPath,files);
                }
                else{
                    FileInputStream in = new FileInputStream(srcFiles[i]);
                    System.out.println(path + srcFiles[i].getName());
                    out.putNextEntry(new ZipEntry(path + srcFiles[i].getName()));
                    int len;
                    while((len=in.read(buf))>0){
                        out.write(buf,0,len);
                    }
                    out.closeEntry();
                    in.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    /**
     * 解压到指定目录
     * @param zipPath
     * @param descDir
     * @author isea533
     */
    public static String unZipFiles(String zipPath,String descDir,String saveFileName){
        return unZipFiles(new File(zipPath), descDir, saveFileName);
    }
    /**
     * 解压文件到指定目录
     * @param zipFile 需解压文件路径
     * @param descDir 路径
     * @param saveFileName 指定保存文件名
     * @author isea533
     */
    @SuppressWarnings("rawtypes")
    public static String unZipFiles(File zipFile,String descDir,String saveFileName){

        String outPath = "";
        try {
            File pathFile = new File(descDir);
            if(!pathFile.exists()){
                pathFile.mkdirs();
            }
            ZipFile zip = new ZipFile(zipFile , "GBK");

            OutputStream out = null;
            InputStream in = null;
            for(Enumeration entries = zip.getEntries(); entries.hasMoreElements();){
                ZipEntry entry = (ZipEntry)entries.nextElement();
                String zipEntryName = entry.getName();
                if(zipEntryName.contains("汇总")){
                    continue;
                }
                in = zip.getInputStream(entry);
                outPath = (descDir+zipEntryName).replaceAll("\\*", "/");
                //判断路径是否存在,不存在则创建文件路径
                File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
                if(!file.exists()){
                    file.mkdirs();
                }
                //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
                if(new File(outPath).isDirectory()){
                    continue;
                }

                //指定保存文件名
                if(StringUtils.isNotBlank(saveFileName)){
                    outPath = descDir + saveFileName;
                    System.out.println(outPath);
                }

                out = new FileOutputStream(outPath);
                byte[] buf1 = new byte[1024];
                int len;
                while((len=in.read(buf1))>0){
                    out.write(buf1,0,len);
                }
                in.close();
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("******************解压完毕********************");

        return outPath;
    }
}
